/**
 * 线程的学习步骤
 * 1.原子性：提供互斥访问，同一时间只能是有一个线程进行操作，
 * <p>CAS操作 Atomic Unsafe.compareAndSafe  CAS存在的问题</p>
 * <p> {@link java.util.concurrent.atomic.AtomicLong} 修改的时候进行无线的循环尝试
 * 进行操作，当并发少的时候循环较少，并发很大的时候就会循环很多次，效率不高</p>
 * <p> {@link java.util.concurrent.atomic.LongAdder}java8 中新增的一个类，将内部核
 * 心热点数据value，分离成一个数组，每一个线程访问的时候通过hash算法定位到</p>
 * <p>其中一个数字进行计数，最终技术结果是求和累加，热点数据会被分成多个cal，单独
 * 维护内部的值，热点分离，在AtomicLong的压力分布到多个点，在第并发的时候对Base直
 * 接更新，在高并发的时候分别计算，在实际计数的时候，一般情况下，我们可以使用
 * {@link java.util.concurrent.atomic.LongAdder}，当并发访问量不大的时候可以也采用
 * {@link java.util.concurrent.atomic.AtomicLong}，当我们需要准确的数据，全局唯一的
 * 时候，我们应该选择AtomicLong来保证全局唯一</p>
 * <p>额外知识点： 对于普通类型的double或者long jvm 允许将64位的读或者写操作变换成
 * 两个32为的操作，</p>
 *
 * 2.可见性：一个线程对主内存的修改可以及时的被其他的线程观察到
 *
 * 3.有序性：一个线程观察其他线程中的指令执行顺序，由于指令重排序的存在，该观察结果一般杂乱无序
 *
 * */
package com.monitor.display_platform.business.thread.safe;